/**
 * @description 创建作品
 */
const { Types } = require('mongoose')
const { nanoid } = require('nanoid')
const { createWork, findOneWork, updateWork } = require('../../service/works')
const { ErrorRes, SuccessRes } = require('../../res-model/index')
const {
  createWorksDbErrorFailInfo,
  createWorksFailInfo,
  forceOffLineFailInfo
} = require('../../res-model/failInfo/index')

/**
 * 创建作品
 * @param {object} userInfo token 携带的用户信息
 * @param {object} data 作品数据
 * @param {object} content 作品内容（复制作品时，会传入）
 */
async function createWorks(userInfo, data = {}, content) {
  const { title } = data
  if (!title) {
    // 标题不能为空
    return new ErrorRes(createWorksFailInfo, '标题不能为空')
  }
  try {
    const { username, _id } = userInfo
    // 因为 _id 太长，这里需要生成一个独一无二的 URL id，使用 nanoid 生成
    const uuid = nanoid(6) // 默认 size 21
    const newEmptyWork = {
      ...data,
      user: new Types.ObjectId(_id),
      author: username,
      uuid
    }

    const res = await createWork(newEmptyWork, content)
    return new SuccessRes(res)
  } catch (ex) {
    console.error('创建作品失败', ex)
    return new ErrorRes(createWorksDbErrorFailInfo) // 写入数据库失败
  }
}

/**
 * 复制作品（通过模板创建，也是复制）
 * @param {string} id workId
 * @param {object} userInfo token 携带的用户信息
 */
async function copyWorks(id, userInfo) {
  const copiedWork = await findOneWork({ id }) // 被复制的项目不一定是自己的，所以查询条件**不加 author**

  // 是否强制下线
  if (parseInt(copiedWork.status, 10) === 3) {
    return new ErrorRes(forceOffLineFailInfo)
  }

  try {
    const { content, title, desc, coverImg, copiedCount } = copiedWork
    const newData = {
      title: `${title}-复制`,
      desc: desc,
      coverImg: coverImg
    }

    const res = await createWorks(userInfo, newData, content)
    // 更新源项目的使用次数
    await updateWork({ copiedCount: copiedCount + 1 }, { id })

    return res
  } catch (ex) {
    console.error('创建作品失败', ex)
    return new ErrorRes(createWorksDbErrorFailInfo) // 写入数据库失败
  }
}

module.exports = {
  createWorks,
  copyWorks
}
